from queue import Queue

# 创建一个容量为3的队列
q = Queue(3)
q.put("msg1")
q.put("msg2")
print(q.qsize())    # 2
print(q.full())     # False
q.put("msg3")
print(q.qsize())    # 3
print(q.full())     # True

# 因为消息队列已满，下面try中的代码都会抛出异常
try:
    q.put("msg4", True, 2)
except:
    print("队列已满,现有消息数量:", q.qsize())

try:
    q.put_nowait("msg4")
except:
    print("队列已满,现有消息数量:", q.qsize())

# 我们要向队列中写入数据时可以先判断再写入
if not q.full():
    q.put("msg4")
# 读取时先做判断再读取
if not q.empty():
    for _ in range(q.qsize()):
        print(q.get_nowait())


print("=" * 50)
from queue import Queue
from threading import Thread
import time

def producer(queue):
    """生产者：向队列添加任务"""
    for i in range(5):
        task = f"任务 {i}"
        print(f"生产任务: {task}")
        queue.put(task)
        time.sleep(0.4)
    # 发送结束信号
    queue.put(None)

def consumer(queue):
    """消费者：处理队列中的任务"""
    while True:
        task = queue.get()
        if task is None:
            queue.task_done()  # 标记结束信号任务完成
            break

        print(f"处理: {task}")
        time.sleep(0.6)  # 模拟处理时间
        queue.task_done()  # 标记当前任务完成
        print(f"完成: {task}")

# 创建队列
q = Queue()

# 创建并启动线程
producer_thread = Thread(target=producer, args=(q,))
consumer_thread = Thread(target=consumer, args=(q,))

producer_thread.start()
consumer_thread.start()

# 等待所有任务完成
q.join()  # 阻塞直到所有task_done()被调用
print("所有任务处理完成")


# 因为q.join()已经确定了所有任务都消费完了，所以下面的代码可以不加
# producer_thread.join()
# consumer_thread.join()